热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

意向|都会_MySQL表级锁行级锁与多粒度锁(意向锁)

篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL表级锁行级锁与多粒度锁(意向锁)相关的知识,希望对你有一定的参考价值。文章目录

篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL表级锁行级锁与多粒度锁(意向锁)相关的知识,希望对你有一定的参考价值。



文章目录


  • InnoDB锁
    • 一、表级锁
    • 二、行级锁
      • 行级锁的基本原理

    • 三、意向锁(多粒度锁)
    • 四、死锁问题
      • 死锁的解决方案




InnoDB锁

与其它存储引擎只支持表级锁不同,InnoDB存储引擎既支持表级锁,又支持行级锁。

常见的锁为:S锁(共享锁Share)和X锁(排它锁Exclusive),可以理解为读锁和写锁。



  • 两个读线程可以同时获得S锁,即S锁是自兼容的;
  • 但是写线程想获得X锁必须等S锁全部释放,且X锁被获取后S锁与X锁都无法被获取,即X锁不是自兼容的,且与S锁互不兼容。


一、表级锁

表级锁的粒度粗,直接将整个表都锁住,虽然解决了并发问题但是读写性能很差。


二、行级锁

行级锁的粒度细,只是将表中的某一行记录锁住,能够实现更加精准的并发控制,但是锁的开销比较大,可能出现死锁的情况。

行锁有三种类型:


  1. Record Lock:给单一行记录上锁,分为S型与X型,控制的是某一条记录。
  2. Gap Lock:给单一行记录上锁,其他线程无法在该记录前插入数据,用于SERIALIZABLE隔离级别解决幻读问题。
  3. Next-Key Lock:即Record Lock和Gap Lock的合体版,给某一行记录加锁的同时不允许在其之前插入数据。

行级锁的基本原理


  • InnoDB行级锁是通过给索引上的索引项加锁来实现的。只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁
  • 当表中锁定了其中的某几行时,不同的事务可以使用不同的索引锁定不同的行
  • 不论使用主键索引、唯一索引还是普通索引,InnoDB都会使用行锁来对数据加锁

三、意向锁(多粒度锁)

意向锁,包括意向共享锁(IS锁)与意向排它锁(IX锁)。意向锁用于标记整个表中行级锁的使用情况,可以快速判断当前表中是否有行级S锁和行级X锁。


  • 当线程加行级S锁之前,必须先加IS锁。
  • 当线程加行级X锁之前,必须先加IX锁。


注:IS锁和IX锁是自兼容且互相兼容的,可以有多个线程给表加IS锁和IX锁。


意向锁的好处在于:


  • 当线程加表级S锁之前,先查看IX锁是否全部释放,如果没有,说明表中有线程在写数据,此时无法获取表级S锁。
  • 当线程加表级X锁之前,先查看IS与IX锁是否全部释放,如果没有,说明表中有线程在读写数据,此时无法获取表级X锁。

如果没有意向锁,则获取表级锁之前需要到表中遍历对应的行级锁是否存在,这样效率太低了。


四、死锁问题



死锁是指两个及以上的事务在执行过程中,因争夺锁资源而造成的一种互相等待的现象。


若无外力作用,事务都将无法推进下去。



死锁的解决方案


  1. 被动解决:设置超时时间。当一个事务超出设定的时间阈值时,则让它进行回滚。
  2. 主动解决:利用锁的信息链表和事务的等待链表建图,判断其中是否存在回路

推荐阅读
  • 前言无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上 ... [详细]
  • MySQL锁机制详解
    本文深入探讨了MySQL中的锁机制,包括表级锁、行级锁以及元数据锁,通过实例详细解释了各种锁的工作原理及其应用场景。同时,文章还介绍了如何通过锁来优化数据库性能,避免常见的并发问题。 ... [详细]
  • 字节跳动夏季招聘面试经验分享
    本文详细记录了字节跳动夏季招聘的面试经历,涵盖了一、二、三轮面试的技术问题及项目讨论,旨在为准备类似面试的求职者提供参考。 ... [详细]
  • 深入解析MySQL中的七种JOIN查询
    本文详细介绍了MySQL中常用的七种JOIN查询方法,包括内连接、左外连接、右外连接、全外连接以及排除连接等,并通过实例进行说明。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • Java多线程实现:从1到100分段求和并汇总结果
    本文介绍如何使用Java编写一个程序,通过10个线程分别计算不同区间的和,并最终汇总所有线程的结果。每个线程负责计算一段连续的整数之和,最后将所有线程的结果相加。 ... [详细]
  • MongoDB的核心特性与架构解析
    本文深入探讨了MongoDB的核心特性,包括其强大的查询语言、灵活的文档模型以及高效的索引机制。此外,还详细介绍了MongoDB的体系结构,解释了其文档、集合和数据库的层次关系,并对比了MongoDB与传统关系型数据库(如MySQL)的逻辑结构。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 本文详细探讨了Java中Volatile关键字的工作原理、优化技巧及其在实际开发中的应用场景,特别是在提高多线程环境下数据可见性和减少锁竞争方面的优势。 ... [详细]
  • Spring Cloud学习指南:深入理解微服务架构
    本文介绍了微服务架构的基本概念及其在Spring Cloud中的实现。讨论了微服务架构的主要优势,如简化开发和维护、快速启动、灵活的技术栈选择以及按需扩展的能力。同时,也探讨了微服务架构面临的挑战,包括较高的运维要求、分布式系统的复杂性、接口调整的成本等问题。最后,文章提出了实施微服务时应遵循的设计原则。 ... [详细]
  • 本文介绍了如何在WildFly 10中配置MySQL数据源时遇到的服务依赖问题及其解决方案。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
  • ssm框架整合及工程分层1.先创建一个新的project1.1配置pom.xml ... [详细]
author-avatar
lovely蓝衣13
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有